<?php
/**
 * Created by PhpStorm.
 * User: admin
 * Date: 2019/1/15
 * Time: 23:05
 */
namespace app\common\library;

use Sco\Bankcard\Bankcard;
use think\exception\ValidateException;

class BankMatch
{

    static $bankcard = null;
    private static $new; //申请一个私有的静态成员变量来保存该类的唯一实例
    private function __construct() {
        self::$bankcard = new Bankcard(); //使用阿里银行认证
    } //声明私有的构造方法，防止类外部创建对象


    public static function instance () { //声明一个静态公共方法，供外部获取唯一实例
        if (!(self::$new instanceof self)) {
            self::$new = new self;
        }
        return self::$new;
    }

    /**
        银行卡匹配
     */
    public function match($card_no) {
        try {
            $info = self::$bankcard->info($card_no);
            //获取银行代码
            $code = $info->getBankCode();
            $name = $info->getBankName();

            if (!$name && $code) {
                doLog('银行编码对应的本地银行数据库未记录，请更新本地银行库:'.$code, 'bankupdate');
            }
            if (!$code) {
                throw new ValidateException('该银行卡错误，阿里云不能正确获取银行卡信息');
            }

            return $name;
        }catch(ValidateException $e) {
            $msg = $e->getMessage();
            $msg = $msg ? $msg : '银行卡号格式不对';
            throw new ValidateException($msg);
        } catch (\Exception $e) {
            $msg = $e->getMessage();
            $msg = $msg ? $msg : '银行卡号格式不对';
            throw new ValidateException($msg);
        }
    }
    //获取银行编码
    public function getCode($card_no) {
        try {
            $info = self::$bankcard->info($card_no);
            //获取银行代码
            $code = $info->getBankCode();
            if (!$code) {
                throw new ValidateException('该银行卡错误，不能正确获取银行卡信息');
            }

            return $code;
        }catch(ValidateException $e) {
            throw new ValidateException($e->getMessage());
        } catch (\Exception $e) {
            throw new ValidateException('银行卡输入有误');
        }
    }

    private function __clone() {} //声明私有的克隆方法，防止对象被克隆

    public function __sleep() { //重写__sleep方法，将返回置空，防止序列化反序列化获得新的对象
        return [];
    }

}